package com.vca.front;

import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.boot.test.context.SpringBootTest;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Random;

/**
 * @author chenbing
 * @date 2022/10/17   17:04
 */
public class hEXtEST {
    public static void main(String[] args) throws Exception {
        String nonce = getRandomString(128);
        System.out.println("nonce = " + nonce);
    }
    
    //length用户要求产生字符串的长度
    public static String getRandomString(int length){
        String str="01234567890123456789012345678901234567890123456789012345678901";
        Random random=new Random();
        StringBuffer sb=new StringBuffer();
        for(int i=0;i<length;i++){
            int number=random.nextInt(62);
            sb.append(str.charAt(number));
        }
        return sb.toString();
    }

    /**
     * jdk原生md5
     */
    public static void md5() throws Exception {
        String str = "0123456789";
        String algorithm = "SHA-256";
        MessageDigest instance = MessageDigest.getInstance(algorithm);
        byte[] digest = instance.digest(str.getBytes(StandardCharsets.UTF_8));
        System.out.println(new String(digest));
        //如果直接输出的话，是乱码�G�s�.u�Iz�۲�
        //这是因为md5生成的消息摘要是128位，也就是等于16个字节，那么有的字节转化为字符之后，这些字符不一定是存在于ascii码之中的
        //通常为了便于输出，我们会将每个字节转变为16进制字符串，每个16进制都是2个字符，所以md5转化之后的字符是32个字符
        StringBuilder stringBuilder = new StringBuilder();
        for (byte b : digest) {
            //每个字节转与0xff（1111 1111）按位与，得到这个字节的补码
            String hex = Integer.toHexString(b & 0xff);
            //如果生成的16进制的字符的长度是1，那么需要在前面补0，比如
            //0,5,10,13,15的16进制分别是是0，5，a,d,f，长度只有1，所以需要前面补0
            if (hex.length() == 1) {
                hex = "0" + hex;
            }
            stringBuilder.append(hex);
        }
        System.out.println(stringBuilder);
    }

    /**
     * 使用commons-codec
     */
    public static void md5codec() {
        String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        String encode = DigestUtils.sha256Hex(str.getBytes(StandardCharsets.UTF_8));
        System.out.println(encode);
    }
}
